package com.ouran.service.user;

import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.aspectj.lang.annotation.AfterReturning;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.ouran.dao.user.UserDao;
import com.ouran.model.page.Pager;
import com.ouran.model.user.User;

/**
 * 用户模块Service实现类
 * @author lijiajun
 * @version 1.0
 * Date 2018/07/28
 */
@Service("userServiceImpl")
public class UserServiceImpl implements UserService {

	
//	SpringCache中常用注解的说明：
//
//	一、@Cacheable注解
//
//	　　最常用的注解，会把被注解方法的返回值缓存。工作原理是：首先在缓存中查找，如果没有执行方法并缓存结果，然后返回数据。此注解的缓存名必须指定，和cacheManager中的caches中的某一个Cache的name值相对应。可以使用value或cacheNames指定。
//	　　如果没有指定key属性，spring会使用默认的主键生成器产生主键。也可以自定义主键，在key中可以使用SpEL表达式。如下：
//	   @Cacheable(cacheNames="content",key="#user.userId")
//	　　		Public User getUser(User user){
//	        xxxxx
//	   }  
//	   @Cacheable参数
//	   1、value  	缓存的名称，在 spring 配置文件中定义，必须指定至少一个 例如：@Cacheable(value="mycache") 或者 
//	   @Cacheable(value={"cache1","cache2"}
//	   2、key  	缓存的 key，可以为空，如果指定要按照 SpEL 表达式编写，如果不指定，则缺省按照方法的所有参数进行组合 例如：
//	   @Cacheable(value="testcache",key="#userName")
//	   3、condition	缓存的条件，可以为空，使用 SpEL 编写，返回 true 或者 false，只有为 true 才进行缓存 例如：
//	   @Cacheable(value="testcache",condition="#userName.length()>2")
//
	
//	二、@CachePut注解  
	
//	        当需要保证方法被调用，又希望结果被缓存, 可以使用@CachePut
//	   @CachePut的属性跟@Cacheable一样
//	　　先执行方法，然后将返回值放回缓存。可以用作缓存的更新。
//
//	三、@CacheEvict注解
//
//	　　该注解负责从缓存中显式移除数据，通常缓存数据都有有效期，当过期时数据也会被移除。
//	　　此注解包含@Cacheable的属性 并且 多了下面两个属性：
//	　　　　allEntries是否移除所有缓存条目。allEntries=true
//	　　　　beforeInvocation：在方法调用前还是调用后完成移除操作。true/false
	
	/**
	 * 引用用户模块Dao
	 */
	@Resource
	UserDao userDaoImpl;
	
	HttpSession session;
	HttpServletRequest request;
	
//	/**
//	 * redis缓存数据
//	 * @param user
//	 */
//	public void redisSaveUser(final User user){
//		
//		userDaoImpl.redisSaveUser(user);
//	}
	
//	/**
//	 * redis读取数据
//	 * @param id
//	 * @return
//	 */
//	public User redisGetUser(final int id){
//		
//		return userDaoImpl.redisGetUser(id);
//	}
	
	/**
	 * 用户登陆
	 * @param userName 用户名
	 * @param passWord 密码
	 * @return 用户信息
	 */
	//@Cacheable(value="userCache",keyGenerator="CacheKeyGenerator")//使用自定义KeyGenerator自动生成缓存的key值
	@Override
	public List<User> checkLogin(String userName, String passWord) {
		
		List<User> list= userDaoImpl.retrieve(userName, passWord);
		 request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); 
		 session=request.getSession();
		if(!list.isEmpty())
		{
			session.setAttribute("userName", list.get(0).getUserName());
		}
		
		return list;
	}

	/**
	 * 新增用户
	 * @param user
	 */
	//@CacheEvict(value="userCache",key="'userCache'",beforeInvocation=true)//方法执行前清空userCache缓存区所有数据
	@Override
	public void addUser(User user) {
		this.userDaoImpl.add(user);
	}

	/**
	 * 根据用户id查询用户信息
	 * @param id
	 * @return
	 */
	//@Cacheable(value="userCache",keyGenerator="CacheKeyGenerator")//使用自定义KeyGenerator自动生成缓存的key值
	@Override
	public User showUser(int id) {
		return userDaoImpl.load(id);
	}
	
	/**
	 * 根据用户userName查询用户信息
	 * @param userName
	 * @return
	 */
	//@Cacheable(value="userCache",keyGenerator="CacheKeyGenerator")//使用自定义KeyGenerator自动生成缓存的key值
	@Override
	public boolean showUser(String userName) {
		return userDaoImpl.load(userName);
	}
	
	/**
	 * 修改用户信息
	 * @param user
	 */
	//@CacheEvict(value="userCache",key="'userCache'",beforeInvocation=true)//方法执行前清空userCache缓存区所有数据
	@Override
	public void updateUser(User user) {
		this.userDaoImpl.update(user);
		request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); 
		session=request.getSession();
		session.setAttribute("userName", user.getUserName());
	}

	/**
	 * 删除用户信息
	 * @param id
	 */
	//@CacheEvict(value="userCache",key="'userCache'",beforeInvocation=true)//方法执行前清空userCache缓存区所有数据
	@AfterReturning(value = "pointcut()")
	@Override
	public void deleteUser(int id) {
		this.userDaoImpl.delete(id);
	}

	/**
	 * 分页查询用户列表
	 * @return
	 */
	//@Cacheable(value="userCache",keyGenerator="CacheKeyGenerator")//使用自定义KeyGenerator自动生成缓存的key值
	@Override
	public Pager<User> userList(Pager<User> pager) {
		return userDaoImpl.retrieveAll(pager);
	}

}
